<?php

/**
 * alltosun.com 接口处理公用函数库 api_helper.php
 * ============================================================================
 * 版权所有 (C) 2009-2014 北京互动阳光科技有限公司，并保留所有权利。
 * 网站地址: http://www.alltosun.com
 * ----------------------------------------------------------------------------
 * 许可声明: 这是一个开源程序，未经许可不得将本软件的整体或任何部分用于商业用途及再发布。
 * ============================================================================
 * $Author: 钱有明 (qianym@alltosun.com) $
 * $Date: 2015-7-3 上午10:11:24 $
 * $Id: api_helper.php 188252M 2016-05-14 06:42:24Z (local) $
 */
class api_helper
{

    private static $api_stat_id;

    /**
     * 测试专用加密方式
     * @param unknown_type $app_id
     * @param unknown_type $arr
     */
    public static function encode_sign($check_params) {
        $params['key'] = api_config::$source_key;
        $params = array_merge($params, $check_params);

        // 排序
        ksort($params, SORT_STRING);
        $params_str = join($params, '');

        return md5($params_str);
    }

    /**
     * 统一的接口验证
     * @param array $params
     */
    public static function check_sign($check_params, $need_token = 0) {
        // 接口名称
        // $api_path = Request::get('url', '');
        $api_path = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        $this_in = an_request('test_in', '0');

        if (ONDEV && !$this_in) {
            //api_helper::return_data(1, '请更新到线上接口测试，测试接口请联系@wangdk!');
        }

        // 用户身份
        $token = an_request('token');
        // 请求时间
        $time = an_request('time');
        // 来源
        $source = an_request('source');
        // 加密串
        $sign = an_request('sign');

        if (!$time || !$source || !$sign) {
            api_helper::return_data(1, 'argument error');
        }


        // =========== start 记接口请求的log ===============================
        $res_params = array(
            'post' => $_POST,
            'get' => $_GET
        );
        $stat_info = array(
            'api_path' => $api_path,
            'request_params' => json_encode($res_params),
            'source' => $source
        );
        self::$api_stat_id = _widget('stat.api_stat')->record($stat_info);

        // =========== end 记接口请求的log =================================

        if (!array_key_exists($source, api_config::$source)) {
            api_helper::return_data(1, '请求来源有误');
        }

        // 签名验证
        $params = array(
            'token' => $token,
            'time' => $time,
            'source' => $source,
            'key' => api_config::$source_key
        );
        $params = array_merge($params, $check_params);
        // self::_p(var_export($params, 1));
        ksort($params, SORT_STRING);
        $params_str = join('', $params);
        $real_sign = md5($params_str);
        // self::_p($real_sign);
        if ($real_sign != $sign) {
            if (Request::getParam('api_test') == 1) {
                // do nothing
            } else {
                api_helper::return_data(1, '接口加密验证失败');
            }
        }

        // 部分接口需登录才能使用
        if ($need_token) {
            if (!$token) {
                api_helper::return_data(1, '请先登录');
            }

            $user_info = user_helper::get_user_info_by_token($token);
            if (!$user_info || $user_info['status'] != 1) {
                api_helper::return_data(1, '该用户不存在或已禁用');
            }
        }

        return self::$api_stat_id;
    }

    /**
     * 检查 是否有权修改
     */
    public static function check_store_key() {
        //经销商 可以修改
    }

    /**
     * 接口通用的返回数据
     * @param int $flag 1有误 0正确
     * @param string $message
     * @param array $info
     * @return $string
     */
    public static function return_data($flag, $message, $info = array(), $api_stat_id = 0, $do_des = 1) {
        header('Content-type: application/json; charset=utf-8');

        $return_data = array(
            'flag' => $flag,
            'message' => $message,
        );

        if ($info) {
            $return_data['response'] = $info;
        }

        if ($do_des) {
            // 转成json数据
            $return_data = json_encode($return_data, JSON_BIGINT_AS_STRING | JSON_UNESCAPED_UNICODE);
            // 加密
            //$des = new DesComponent('12345678');
            //$return_data = $des->encrypt($return_data);
        }

        if (empty($api_stat_id) && !empty(self::$api_stat_id)) {
            $api_stat_id = self::$api_stat_id;
        }

        if ($api_stat_id) {
            _widget('stat.api_stat')->update_record($api_stat_id, array('response' => $return_data));
        }

        self::write_log($return_data);

        exit($return_data);
    }

    /**
     * 通过token取用户身份
     * @return array
     */
    public static function get_user_info() {
        // 用户身份
        $token = an_request('token');

        // 请求时间
        $time = an_request('time');
        // 来源
        $source = an_request('source');
        // 加密串
        $sign = an_request('sign');

        if (!$time || !$source || !$sign) {
            //return 0;
        }

        //$user_id = 0;
        $user_info = user_helper::get_user_info_by_token($token);
        if ($user_info && $user_info['status'] == 1) {
            $_SESSION['user_id'] = $user_info['id'];
            //$_SESSION['company_id'] = $user_info['company_id'];

            return $user_info;
        }

        return array();
    }

    /**
     * 验证参数是否伪造
     * @param string $string 加密字符串
     * @param $param 参数集合
     * @param $keys 密钥
     */
    public static function verification_key($string, $param = array()) {
        $keys = 'v3i8K48GmvF';
        $data = '';

        if (!$string) {
            return false;
        }

        foreach ($param as $k => $v) {
            /*   if (empty($v)) {
                  unset($param[$k]);
              } */
            if ($v && isset($v)) {
                $data .= $v;
            }
        }
        //var_dump($data);
        $data .= $keys;

        $data = md5($data);
        if ($data == $string) {
            return true;
        } else {
            return false;
        }
    }

    public static function _p() {

        if (D_BUG || ONDEV) {

            if (!func_num_args()) {
                return;
            }

            if (!is_dir(APP_LOG_DIR)) {
                $isok = @mkdir(APP_LOG_DIR, 0777, true);
                if (!$isok) {
                    return;
                }
            }

            $path = APP_LOG_DIR . '/api-' . date("Ymd") . '.log';

            $line = '> [' . date("Y-m-d H:i:s") . '] >>>>>>>>>>>>>>>' . "\n";

            $args = func_get_args();

            foreach ($args as $msg) {

                if (is_numeric($msg) || is_string($msg)) {
                    $line .= $msg;
                } elseif (is_array($msg)) {
                    // $line .= json_encode($msg, JSON_UNESCAPED_UNICODE);
                    $line .= var_export($msg, 1);
                }

                $line .= "\n";
            }

            $line .= '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<';
            file_put_contents($path, $line . "\n", FILE_APPEND);
        }
    }

    public static function write_log($msg) {
        if (D_BUG || ONDEV) {
            if (!is_dir(APP_LOG_DIR)) {
                $isok = @mkdir(APP_LOG_DIR, 0777, true);
                if (!$isok) {
                    return;
                }
            }

            $path = APP_LOG_DIR . '/api-' . date("Ymd") . '.log';

            $line = date("Y-m-d H:i:s\t");
            $line .= substr(session_id(), 0, 6) . "\t";

            file_put_contents($path, $line . $_SERVER['REQUEST_URI'] . "\n", FILE_APPEND);

            foreach ($_POST as $k => $v) {
                if (strlen($v) >= 100) {
                    $str = substr($v, 0, 100) . " ...";
                } else {
                    $str = $v;
                }

                file_put_contents($path, $line . $k . " => " . $str . "\n", FILE_APPEND);

            }

            $str = '';
            if (is_string($msg)) {
                $str = $line . $msg;
            } elseif (is_array($msg)) {
                $str = $line . json_encode($msg, JSON_UNESCAPED_UNICODE);
            }

            file_put_contents($path, $str . "\n", FILE_APPEND);
        }
    }

    /**
     * 将从数据库中取出的数据以以其中一个字段为键转化为新的数组
     * @param unknown $field
     * @param unknown $data_list
     * @return multitype:|multitype:unknown
     */
    public static function array_to_filelds_assoc($field, $data_list) {
        if (!$data_list || !is_array($data_list)) {
            return array();
        }

        $list = array();
        foreach ($data_list as $k => $v) {
            if (!isset($v[$field])) {
                continue;
            }
            $list[$v[$field]] = $v;
        }
        return $list;
    }
}

?>